本篇同步發布於Blog: [解題] LeetCode - 409 Longest Palindrome
LeetCode
409 - Longest Palindrome
https://leetcode.com/problems/longest-palindrome/
輸入1個字串,裡面有不同的字元,且大小寫也視為不同,求從這些字元組成最大回文的長度。
比如範例輸入的abccccdd,能組成最大長度為7的回文,有可能是ccdadcc或者其他的組合。
分析每個字元出現的頻率,假如X字元出現偶數次,則它一定能全部拿去組回文。但如果X字元出現奇數次,則只能取它的數量-1後再拿去組回文,假如目前回文的長度是偶數,則剛剛那筆奇數次的字元,被-1的數量要再補上去,這樣仍是回文。
以範例輸入的abccccdd:
所以最長的長度為7。
難度為Easy
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
int longestPalindrome(string s) {
int letters[128] = {0};
for(char c : s){
letters[c]++;
}
int ans = 0;
for(int i = 0 ; i < 128;++i){
int curLen = letters[i];
if(letters[i] % 2 == 1){
curLen--;
}
ans += curLen;
if(ans % 2 == 0 && letters[i] % 2 == 1){
ans++;
}
}
return ans;
}
};
int main() {
Solution sol;
cout << sol.longestPalindrome("abccccdd") << endl;
return 0;
}
using System;
namespace LeetCode409
{
public class Solution {
public int LongestPalindrome(string s) {
int[] letters = new int[128];
foreach(char c in s){
letters[(int)c]++;
}
int ans = 0;
for(int i = 0 ; i < 128;++i){
int curLen = letters[i];
if(letters[i] % 2 == 1){
curLen--;
}
ans+=curLen;
if(ans % 2 == 0 && letters[i] % 2 == 1){
ans++;
}
}
return ans;
}
}
public class Program
{
public static void Main()
{
Solution sol = new Solution();
Console.WriteLine(sol.LongestPalindrome("abccccdd"));
Console.Read();
}
}
}
https://github.com/u8989332/ProblemSolving/blob/master/LeetCode/C%2B%2B/400-499/409.cpp
https://github.com/u8989332/ProblemSolving/blob/master/LeetCode/C%23/400-499/409.cs